xm reboot: Fix wait option of xm reboot command
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 7 Feb 2008 09:27:46 +0000 (09:27 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 7 Feb 2008 09:27:46 +0000 (09:27 +0000)
When I rebooted a domain by xm reboot command with wait option,
I saw the following message.  But, rebooting the domain succeeded.
 Domain vm1 destroyed for failed in rebooting

The cause why the message was shown is the domain is destroyed
temporarily by processing of xm reboot command.  The domain
information is not gotten from Xend by server.xend.domains()
function till recreating the domain is completed.
This patch fixes processing of xm reboot command in Xm side.
It waits just a bit till recreating the domain is completed,
then it measures the success or failure of the reboot of the
domain.

Signed-off-by: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
tools/python/xen/xm/shutdown.py

index 8284a73bcad5755fa07867bc9687f258109f5fba..6903183e9aa1867f8207b69620b0f42c3ba66af4 100644 (file)
@@ -24,6 +24,8 @@ from opts import *
 from main import server, serverType, SERVER_XEN_API, get_single_vm
 from xen.xend.XendAPIConstants import *
 
+RECREATING_TIMEOUT = 30
+
 gopts = Opts(use="""[options] [DOM]
 
 Shutdown one or more domains gracefully.
@@ -53,6 +55,7 @@ def wait_reboot(opts, doms, rcs):
     if serverType == SERVER_XEN_API:
         opts.err("Cannot wait for reboot w/ XenAPI (yet)")
 
+    recreating = {}
     while doms:
         alive = server.xend.domains(0)
         reboot = []
@@ -61,9 +64,17 @@ def wait_reboot(opts, doms, rcs):
                 rc = server.xend.domain.getRestartCount(d)
                 if rc == rcs[d]: continue
                 reboot.append(d)
+
+            # Probably the domain is being recreated now.
+            # We have to wait just a bit for recreating the domain.
+            elif not recreating.has_key(d):
+                recreating[d] = 0
             else:
-                opts.info("Domain %s destroyed for failed in rebooting" % d)
-                doms.remove(d)
+                recreating[d] += 1
+                if recreating[d] > RECREATING_TIMEOUT:
+                    opts.info("Domain %s destroyed for failing to reboot" % d)
+                    doms.remove(d)
+
         for d in reboot:
             opts.info("Domain %s rebooted" % d)
             doms.remove(d)